{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import re\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Задача №1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "dict = { \n",
    "    777: 200,\n",
    "    999:100,\n",
    "    555:50,\n",
    "    333:15,\n",
    "    111:10,\n",
    "    '\\d77':5,\n",
    "    '\\d\\d7':3,\n",
    "    '\\d00':2,\n",
    "    '\\d\\d0':1\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ваш баланс за 100000 попыток равен 173687\n",
      "Ваш баланс за 100000 попыток равен 177854\n",
      "Ваш баланс за 100000 попыток равен 175575\n",
      "Ваш баланс за 100000 попыток равен 172243\n",
      "Ваш баланс за 100000 попыток равен 175560\n",
      "Ваш баланс за 100000 попыток равен 176798\n",
      "Ваш баланс за 100000 попыток равен 175343\n",
      "Ваш баланс за 100000 попыток равен 175601\n",
      "Ваш баланс за 100000 попыток равен 176224\n",
      "Ваш баланс за 100000 попыток равен 176939\n"
     ]
    }
   ],
   "source": [
    "# Модель\n",
    "# массив для сбора статистики сколько выигрывает за все попытки и все игры\n",
    "arr_profit = pd.DataFrame(columns=['value'])\n",
    "for i in range(0, 10):\n",
    "    # баланс по итогу за все попытки и все игры\n",
    "    profit_full = 0\n",
    "    count_of_attempts = 100000\n",
    "    # массив для сбора статистики сколько выигрывает за одну игру\n",
    "    arr_profit_temp = []\n",
    "    for i in range(0, count_of_attempts):\n",
    "        # генерация случайного числа\n",
    "        random_number = np.random.randint(0,1000)\n",
    "        profit_full -= -1\n",
    "        profit = -1\n",
    "        # переменная для учёта статистики по всем играм\n",
    "        check_try = False\n",
    "        for key in dict:\n",
    "            # поиск совпадений\n",
    "            pattern = str(key)\n",
    "            if re.match(pattern, str(random_number)) != None:\n",
    "                profit_full += dict[key]\n",
    "                profit += dict[key]\n",
    "                arr_profit_temp.append(profit)\n",
    "                check_try = True\n",
    "                break\n",
    "\n",
    "        if check_try == False:\n",
    "            arr_profit_temp.append(-1)\n",
    "\n",
    "    print('Ваш баланс за ' + str(count_of_attempts) + ' попыток равен ' + str(profit_full))\n",
    "    arr_profit_temp = pd.DataFrame({'value': arr_profit_temp})\n",
    "    arr_profit = pd.concat([arr_profit, arr_profit_temp], axis=0, ignore_index=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>value</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>1000000.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>-0.244176</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>7.294914</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>-1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>-1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>-1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>-1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>199.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                value\n",
       "count  1000000.000000\n",
       "mean        -0.244176\n",
       "std          7.294914\n",
       "min         -1.000000\n",
       "25%         -1.000000\n",
       "50%         -1.000000\n",
       "75%         -1.000000\n",
       "max        199.000000"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# просмотр статистики по выйгрышу в каждой игре\n",
    "df = pd.DataFrame(arr_profit, columns=['value'])\n",
    "df.value = df.value.astype(int)\n",
    "mean_from_model = np.round(df.value.mean(), 2)\n",
    "df.describe()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Выводы:\n",
    "\n",
    "#### Игроку игра не выгодна, т.к. из 10 попыток по 10 000 игр он всегда остается с отрицательным балансом \n",
    "#### В среднем игром теряет -0.2 рубля за один раз"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Задача №2. Теоретические расчёты и сравнение с моделью"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# расчет шансов\n",
    "dict_odds = {\n",
    "    777: 1/1000,\n",
    "    999: 1/1000,\n",
    "    555: 1/1000,\n",
    "    333: 1/1000,\n",
    "    111: 1/1000,\n",
    "    '\\d77': 8/1000,\n",
    "    '\\d\\d7': 89/1000,\n",
    "    '\\d00': 9/1000,\n",
    "    '\\d\\d0': 90/1000,\n",
    "    -1 : (1000-201)/1000\n",
    "}\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.0\n"
     ]
    }
   ],
   "source": [
    "# проверка корректности вычислений шансов\n",
    "a = 0\n",
    "for i in dict_odds:\n",
    "    a += float(dict_odds[i])\n",
    "\n",
    "print(a) # должно быть равно 1, иначе подсчёт шансов неверен"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# создание нового словаря\n",
    "dict_new = dict.copy()\n",
    "# обновление суммы выйгрыша\n",
    "for i in dict_new:\n",
    "    dict_new[i] = dict_new[i] - 1\n",
    "# добавление в словарь дополнительной информации для вычисления средней\n",
    "dict_new[-1]=-1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# подсчёт теоретического среднего значения выйгрыша за один раз\n",
    "odds_for_one_attempt = 0 \n",
    "for i in dict_new:\n",
    "    odds_for_one_attempt += dict_odds[i] * dict_new[i]\n",
    "\n",
    "odds_for_one_attempt = np.round(odds_for_one_attempt,2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Средний выйгрыш за один раз из модели: -0.24 руб.\n",
      "Среднее выйгрыш за один раз из теоретических вычислений: -0.21 руб.\n"
     ]
    }
   ],
   "source": [
    "# сравнение среднего из модели и теоретического\n",
    "print(\"Средний выйгрыш за один раз из модели: \" + str(mean_from_model) + \" руб.\")\n",
    "print(\"Среднее выйгрыш за один раз из теоретических вычислений: \" + str(odds_for_one_attempt) + \" руб.\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
